package com.sc.nft.util;

import cn.hutool.core.util.StrUtil;
import org.springframework.util.Assert;

import java.util.function.Predicate;

public final class ValueUtil {

    /**
     * 原值为空时返回默认值，否则返回原值
     *
     * <pre>{@code
     * // 代替此类逻辑（含：三目运算赋值语句）
     * if (originValue == null) {
     *     originValue = defaultValue;
     * }
     *
     * ValueUtil.or(null, defaultValue) == defaultValue // 原值为NULL，返回默认值
     * ValueUtil.or(originValue, defaultValue) == originValue // 原值非NULL，返回原值
     * }</pre>
     *
     * @param value        原值
     * @param defaultValue 默认值
     * @param <T>
     * @return
     */
    public static <T> T or(T value, T defaultValue) {
        return value != null ? value : defaultValue;
    }

    /**
     * 不匹配则返回默认值，否则返回原值
     *
     * <pre>{@code
     * assertEquals(1000, ValueUtil.or(10000, i -> i <= 1000, 1000)); // 原值小于等于1000，返回原值，否则返回默认值
     * assertEquals(100, ValueUtil.or(100, i -> i <= 1000, 1000)); // 原值大于1000，返回默认值，否则返回原值
     * }</pre>
     *
     * @param value        原值
     * @param predicate    推断表达式，非空，匹配则返回原值，否则返回默认值
     * @param defaultValue 默认值
     * @param <T>
     * @return
     */
    public static <T> T or(T value, Predicate<T> predicate, T defaultValue) {
        Assert.notNull(predicate, "推断表达式不能为空");
        return predicate.test(value) ? value : defaultValue;
    }

    /**
     * 值为NULL或空白字符串时返回默认值，否则返回原值
     *
     * <pre>{@code
     * assertEquals("None", ValueUtil.orBlankString(null, "None"));
     * assertEquals("None", ValueUtil.orBlankString("", "None"));
     * assertEquals("None", ValueUtil.orBlankString(" ", "None"));
     * assertEquals("Ashe", ValueUtil.orBlankString("Ashe", "None"));
     * }</pre>
     *
     * @param value        原值
     * @param defaultValue 默认值
     * @return
     */
    public static String orBlankString(String value, String defaultValue) {
        return StrUtil.isNotBlank(value) ? value : defaultValue;
    }

}
